/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package JPA;

import DAO.TareaDAO;
import domain.Entity.EntityProyecto;
import domain.Entity.EntityTarea;
import domain.Entity.EntityTrabajador;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

/**
 *
 * @author jorge
 */
public class JPATareaDAO implements TareaDAO{
    
    public EntityTarea obtenerTarea(String nombre, long idProyecto) {
        EntityTarea et = new EntityTarea();
       try {
            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            
            Query q = em.createQuery("SELECT t FROM EntityTarea t WHERE t.nombreTarea = :nombre AND t.epy.idProyecto =:idProyecto ");
            q = q.setParameter("nombre", nombre);
            q = q.setParameter("idProyecto", idProyecto);
            List resultado = q.getResultList();
            if(resultado.size() > 0){
                
                  et = (EntityTarea) resultado.remove(0);
                
            }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return et;
    }


    public void anadirTarea(EntityTarea et) {
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            em.persist(et);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List tareasProyecto(Long idProyecto) {
         List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT t FROM EntityTarea t WHERE t.epy.idProyecto = :idProyecto");
            q = q.setParameter("idProyecto", idProyecto);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public void borrarTarea(Long idTarea) {
         EntityTarea et = new EntityTarea();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            et = em.find(domain.Entity.EntityTarea.class, idTarea);
            em.remove(et);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void modificarTarea(EntityTarea et) {
         try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityTarea tarea = em.find(domain.Entity.EntityTarea.class, et.getIdTarea());
            tarea.setNombreTarea(et.getNombreTarea());
            tarea.setFecha_ini(et.getFecha_ini());
            tarea.setFecha_fin(et.getFecha_fin());
            tarea.setCompletado(et.isCompletado());
            tarea.setEtiquetas(et.getEtiquetas());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public EntityTarea getTarea(long idTarea) {
        EntityTarea et = new EntityTarea();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            et = em.find(domain.Entity.EntityTarea.class, idTarea);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
       return et; 
    }

    public void asignarTarea(EntityTarea et) {
        
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityTarea tarea= em.find(domain.Entity.EntityTarea.class,et.getIdTarea());
            tarea.getEtr().addAll(et.getEtr());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List trabajadoresTarea(long idTarea) {
        List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            //Query q = em.createQuery("SELECT trabajador FROM EntityTrabajador trabajador WHERE trabajador.et = :et");
            Query q = em.createQuery("SELECT tarea.etr FROM EntityTarea tarea WHERE tarea.idTarea = :idTarea");
            q = q.setParameter("idTarea", idTarea);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public void quitarTrabajador(EntityTarea et) {
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityTarea tarea= em.find(domain.Entity.EntityTarea.class,et.getIdTarea());
            tarea.setEtr(et.getEtr());
            em.persist(tarea);
            utx.commit();
            //em.flush();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List TareasDelTrabajador(long dni) {
          List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT etr.et FROM EntityTrabajador etr WHERE etr.dni = :dni  ");
            q = q.setParameter("dni", dni);
            resultado = q.getResultList();
            
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
            
    return resultado;
    }

    public void quitarTarea(EntityTarea et) {
       try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityTarea tarea= em.find(domain.Entity.EntityTarea.class,et.getIdTarea());
            tarea.getEtr().removeAll(et.getEtr());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List trabajo(Date fechaIni, EntityTarea tarea, Date fechaFin) {
        List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT ett FROM EntityTareaTrabajada ett WHERE ett.et = :tarea AND ett.fecha >= :fechaIni AND ett.fecha <= :fechaFin ");
            q = q.setParameter("tarea", tarea);
            q = q.setParameter("fechaIni", fechaIni);
            q = q.setParameter("fechaFin", fechaFin);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public List trabajoTrabajador(Date fechaIni, EntityTarea tarea, EntityTrabajador trabajador, Date fechaFin) {
         List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT ett FROM EntityTareaTrabajada ett WHERE ett.et = :tarea AND ett.etr = :trabajador AND ett.fecha >= :fechaIni AND ett.fecha <= :fechaFin ");
            q = q.setParameter("tarea", tarea);
            q = q.setParameter("trabajador", trabajador);
            q = q.setParameter("fechaIni", fechaIni);
            q = q.setParameter("fechaFin", fechaFin);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public void completar(EntityTarea et) {
          try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityTarea tarea = em.find(domain.Entity.EntityTarea.class, et.getIdTarea());
            tarea.setCompletado(et.isCompletado());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List tareasProyectoEtiqueta(Long idProyecto,String etiqueta) {
       List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT t FROM EntityTarea t WHERE t.epy.idProyecto = :idProyecto AND t.etiquetas LIKE :etiqueta");
            q = q.setParameter("idProyecto", idProyecto);
            q = q.setParameter("etiqueta", etiqueta);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public List TareasDelTrabajadorEtiqueta(EntityTrabajador etr, String etiqueta) {
         List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT t FROM EntityTarea t WHERE t.etr = :etr AND t.etiquetas LIKE :etiqueta");
            q = q.setParameter("etr", etr);
            q = q.setParameter("etiqueta", etiqueta);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }

    public void etiquetar(EntityTarea et) {
       try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityTarea tarea = em.find(domain.Entity.EntityTarea.class, et.getIdTarea());
            tarea.setEtiquetas(et.getEtiquetas());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPATareaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
}
